/*******************************************************************************************
*
*   raylib [textures] example - Draw part of the texture tiled
*
*   This example has been created using raylib 3.0 (www.raylib.com)
*   raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
*
*   Copyright (c) 2020 Vlad Adrian (@demizdor) and Ramon Santamaria (@raysan5)
*
********************************************************************************************/
#include "raylib.h"

#define SIZEOF(A) (sizeof(A)/sizeof(A[0]))
#define OPT_WIDTH 220  // max width for the options container
#define MARGIN_SIZE 8  // size for the margins
#define COLOR_SIZE 16  // size of the color select buttons

int main(int argc, char **argv)
{
    // Initialization
    //--------------------------------------------------------------------------------------
    int screenWidth = 800;
    int screenHeight = 450;
    
    SetConfigFlags(FLAG_WINDOW_RESIZABLE); // Make the window resizable
    InitWindow(screenWidth, screenHeight, "raylib [textures] example - Draw part of a texture tiled");

    // NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required)
    Texture ptex = LoadTexture("resources/pat.png");
    SetTextureFilter(ptex, FILTER_TRILINEAR); // Makes the texture smoother when upscaled
    
    // Coordinates for all patterns inside the texture
    const Rectangle patRec[] = { (Rectangle){3,3,66,66}, (Rectangle){75,3,100,100}, 
            (Rectangle){3,75,66,66}, (Rectangle){7,156,50,50}, (Rectangle){85,106,90,45}, (Rectangle){75,154,100,60} };
    
    // Setup colors
    const Color colors[] = { BLACK, MAROON, ORANGE, BLUE, PURPLE, BEIGE, LIME, RED, DARKGRAY, SKYBLUE};
    enum {MAX_COLORS = SIZEOF(colors)};
    Rectangle colorRec[MAX_COLORS] = { 0 };

    // Calculate rectangle for each color
    for(int i=0, x=0, y=0; i<MAX_COLORS; i++) {
        colorRec[i].x =  2+MARGIN_SIZE + x;
        colorRec[i].y =  22+256+MARGIN_SIZE + y;
        colorRec[i].width = COLOR_SIZE*2;
        colorRec[i].height = COLOR_SIZE;
        if(i == MAX_COLORS/2 - 1) {
            x = 0; y += COLOR_SIZE + MARGIN_SIZE;
        } else x += COLOR_SIZE * 2 + MARGIN_SIZE; 
        
    }

    int activePat = 0, activeCol = 0;
    float scale = 1.0f, rotation = 0.0f;
    
    SetTargetFPS(60);
    //---------------------------------------------------------------------------------------
    
    // Main game loop
    while (!WindowShouldClose())    // Detect window close button or ESC key
    {
        // Update
        //----------------------------------------------------------------------------------
        screenWidth = GetScreenWidth();
        screenHeight = GetScreenHeight();
        
        // Handle mouse
        if(IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) {
            const Vector2 mouse = GetMousePosition();
            
            // Check which pattern was clicked and set it as the active pattern
            for(int i=0; i<SIZEOF(patRec); ++i) {
                if(CheckCollisionPointRec(mouse, (Rectangle){2+MARGIN_SIZE+patRec[i].x, 40+MARGIN_SIZE+patRec[i].y,patRec[i].width, patRec[i].height})) { 
                    activePat = i; 
                    break; 
                }
            }
            
            // Check to see which color was clicked and set it as the active color
            for(int i=0; i<MAX_COLORS; ++i) {
                if(CheckCollisionPointRec(mouse, colorRec[i])) {
                    activeCol = i;
                    break;
                }
            }
        }
        
        // Handle keys
        
        // Change scale
        if(IsKeyPressed(KEY_UP)) scale += 0.25f;
        if(IsKeyPressed(KEY_DOWN)) scale -= 0.25f;
        if(scale > 10.0f) scale = 10.0f;
        else if( scale <= 0.0f) scale = 0.25f;
        
        // Change rotation
        if(IsKeyPressed(KEY_LEFT)) rotation -= 25.0f;
        if(IsKeyPressed(KEY_RIGHT)) rotation += 25.0f;
        
        // Reset
        if(IsKeyPressed(KEY_SPACE)) { rotation = 0.0f; scale = 1.0f; }
        //----------------------------------------------------------------------------------
        
        // Draw
        //----------------------------------------------------------------------------------
        BeginDrawing();
            ClearBackground(RAYWHITE);
            
            // Draw the tiled area
            DrawTextureTiled(ptex, patRec[activePat], (Rectangle){OPT_WIDTH+MARGIN_SIZE, MARGIN_SIZE, screenWidth - OPT_WIDTH - 2*MARGIN_SIZE, screenHeight - 2*MARGIN_SIZE},
                (Vector2){0.0f, 0.0f}, rotation, scale, colors[activeCol]);
            
            // Draw options
            DrawRectangle(MARGIN_SIZE, MARGIN_SIZE, OPT_WIDTH - MARGIN_SIZE, screenHeight-2*MARGIN_SIZE, ColorAlpha(LIGHTGRAY, 0.5f));
            
            DrawText("Select Pattern", 2+MARGIN_SIZE, 30+MARGIN_SIZE, 10, BLACK);
            DrawTexture(ptex, 2+MARGIN_SIZE, 40+MARGIN_SIZE, BLACK);
            DrawRectangle(2+MARGIN_SIZE + patRec[activePat].x, 40+MARGIN_SIZE+patRec[activePat].y,patRec[activePat].width, patRec[activePat].height, ColorAlpha(DARKBLUE, 0.3f));
            
            DrawText("Select Color", 2+MARGIN_SIZE, 10+256+MARGIN_SIZE, 10, BLACK);
            for(int i=0; i<MAX_COLORS; ++i) {
                DrawRectangleRec(colorRec[i], colors[i]);
                if(activeCol == i) DrawRectangleLinesEx(colorRec[i], 3.0f, ColorAlpha(WHITE, 0.5f));
            }
            
            DrawText("Scale (UP/DOWN to change)", 2+MARGIN_SIZE, 80+256+MARGIN_SIZE, 10, BLACK);
            DrawText(TextFormat("%.2fx", scale), 2+MARGIN_SIZE, 92+256+MARGIN_SIZE, 20, BLACK);
            
            DrawText("Rotation (LEFT/RIGHT to change)", 2+MARGIN_SIZE, 122+256+MARGIN_SIZE, 10, BLACK);
            DrawText(TextFormat("%.0f degrees", rotation), 2+MARGIN_SIZE, 134+256+MARGIN_SIZE, 20, BLACK);
            
            DrawText("Press [SPACE] to reset",  2+MARGIN_SIZE, 164+256+MARGIN_SIZE, 10, DARKBLUE);
            
            // Draw FPS
            DrawText(TextFormat("%i FPS", GetFPS()), 2+MARGIN_SIZE, 2+MARGIN_SIZE, 20, BLACK);
        EndDrawing();
        //----------------------------------------------------------------------------------
    }
    
    // De-Initialization
    //--------------------------------------------------------------------------------------
    UnloadTexture(ptex);
    CloseWindow();                // Close window and OpenGL context
    //--------------------------------------------------------------------------------------
    
	return 0;
}

